package demo2;

/**
 * Created with IntelliJ IDEA
 * Description：多态
 * User：chenshu
 * Date：2023-10-19
 * Time：10:17
 */
class Animal {
    public String name;
    public int age;
    void eat() {
        System.out.println(this.name + "在吃饭！");
    }
}
class Cat extends Animal {
    private String name;

    public Cat(String name) {
        this.name = name;
    }

    /**
     * 方法重写：
     * 1、静态方法 不能重写
     * 2、private方法 不能重写
     * 3、子类的访问修饰限定父大于等于父类
     * 4、被final修饰的方法不能被重写
     */
    void eat() {
        System.out.println(this.name + "吃猫粮～");
    }
}

class Dog extends Animal {
    private String name;

    public Dog(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(this.name + "吃狗粮");
    }
}
class Bird extends Animal {
    private String name;

    public Bird(String name) {
        this.name = name;
    }
    public void fly() {
        System.out.println(this.name + "正在飞！！");
    }
}
public class TestDemo {
    public static void main(String[] args) {
        //Animal animal = new Cat("米米");
        Animal animal = new Bird("云雀");
        //检查animal是否是Bird的引用，如果是的话才能运行代码块里的代码
        if (animal instanceof Bird) {
            Bird bird = (Bird)animal;//demo2.Cat cannot be cast to demo2.Bird
            bird.fly();
        };
    }
    public static void main3(String[] args) {
        Animal animal = new Bird("云雀");
        // animal.fly() ：无法允许fly
        //向下转型
        Bird bird = (Bird)animal;
        bird.fly();
    }
    /**
     * 1、向上转型 2、发生重写 3、通过父类引用，调用这个同名的方法。此时会发生动态绑定
     * @param animal
     */
    public static void func(Animal animal) {
        animal.eat();
    }

    public static void main2(String[] args) {
        Cat cat = new Cat("米米");
        Dog dog = new Dog("旺财");
        func(cat);
        func(dog);
    }
    public static void main1(String[] args) {
        //向上转型
        Animal animal = new Cat("米米");
        animal.name = "咪咪";
        System.out.print(animal.name + "：");
        //方法重写：编译时.class文件里还是Animal的eat，但是运行时变成了Cat的eat
        //动态绑定：运行时绑定    静态绑定：编译时确定
        animal.eat();
    }
}
